Cpp|作用域限定符的七种使用场合和用法

小智雅汇 2018-12-27 11:35

在不同作用域内声明的变量或函数可以同名,但如果在同一个作用域内同时存在局部变量(函数)和全局变量(函数)时,通常局部(或内部)变量(或函数)会覆盖掉全局(或外部)的变量(或函数)。如何在这个作用域内访问外部作用域中同名的变量(函数)?使用作用域限定符。

1 区分同名的全局变量和局部变量

#include<iostream>

using namespace std;

int sum=0;

const int N=15;

int main()

{

int n,a[N],sum=0;

cin>>n;

for(int i=0;i

cin>>a[i];

for(int i=0;i

{

if(i%2==0) sum+=a[i];

::sum+=a[i];

}

cout<<"all="<<::sum<<' '<<"odd="<<sum;

return 0;

}

2 类的成员函数在类外定义时,指明该函数的作用域为该类

#include<iostream>

using namespace std;

int calculate(int x)

{return 2*x*x+4*x+6;}

class A

{

private:

int a;

public:

int calculate();

A(int m) {a=m;}

};

int A::calculate()

{return 2*a*a+4*a+5;}

int main()

{

A b(5);

cout<<::calculate(5)<<endl;

cout<<b.calculate()<<endl;

return 0;

}

3 命名空间限定

当想输出某命名空间(如:namespace ns1)中成员的数据时,可以采用命名空间名和作用域限定符::指向该成员数据。

#include <iostream>

using namespace std;

namespace ns1 //命名空间ns1

{

int a = 3;

double b = 4;

double tax()

{

return a * b;

}

namespace ns2 // 嵌套的命名空间ns2

{

int age =11;

}

}

void main()

{

std:cout<<ns1::a<<endl; // 输出命名空间ns1中成员的数据

cout<<ns1::tax()<<endl;

cout<<ns1::ns2::age<<endl; // 需要依次指定外层和内层的命名空间名

cin.get();

}

4 显示调用父类中被子类覆盖的函数

在子类中可用::显式调用父类中的成员函数或成员变量,可以调用到父类被子类覆盖的函数。如子类B和父类A均有void fun();这个函数,因为是函数覆盖,直接调用是调用不了父类中的fun(),这时,只要A::fun()这样显式指明即可调用。

5 要表明某个函数不属于任何类时

通常是类里有成员函数跟全局函数名字相同时使用。

例如在某个类里这样写

::change(int& i); //表明change函数不属于任何类,通常是一个全局函数

6 在类内使用typedef声明了某类型的别名,在类外使用时

如在类A内有这样的声明:

typedef unsign int UINT;

在类外需要定义一个width类型的变量时可以这样写:

A::UINT i;

7 使用类的静态成员变量或成员函数时使用

静态成员既可以通过对象名引用,也可以通过类名+::引用。

-End-

本页共82段,1627个字符,2813 Byte(字节)